/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ejb;


import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 *
 * @author Rob
 */
@Stateless
public class MessaggioFacade extends AbstractFacade<Messaggio> implements MessaggioFacadeLocal {
    @PersistenceContext(unitName = "EnterpriseApplication12-13-ejbPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public MessaggioFacade() {
        super(Messaggio.class);
    }
    
    /**
    * Cerca tutti i messaggi di un utente 
    * @param ut utente mittente e destinatario
    * @return List<Messaggio> lista dei messaggi corrispondenti all'utente ut, altrimenti restituisce una lista vuota
    */ 
    @Override
    public List<Messaggio> getAllMessages(Utente ut){
        String strSQL = "SELECT m.ID,m.CONTENUTO,m.DATA,m.LETTO,m.MITTENTE_ID "
                + "FROM MESSAGGIO m, MESSAGGIO_UTENTE mu, UTENTE u "
                +"WHERE mu.MESSAGGIOS_ID = m.ID AND mu.DESTINATARI_ID = u.ID AND m.MITTENTE_ID=" + ut.getId();
        return (List<Messaggio>)em.createNativeQuery(strSQL,Messaggio.class).getResultList();
    }
    
    /**
    * Cerca tutti i messaggi ricevuti da un utente 
    * @param ut utente destinatario
    * @return List<Messaggio> lista dei messaggi ricevuti dall'utente ut, altrimenti restituisce una lista vuota
    */ 
    @Override
     public List<Messaggio> getReceivedMessages(Utente ut){
        String strSQL = "SELECT m.ID,m.CONTENUTO,m.DATA,m.LETTO,m.MITTENTE_ID "
                + "FROM MESSAGGIO m, MESSAGGIO_UTENTE mu, UTENTE u "
                +"WHERE mu.MESSAGGIOS_ID = m.ID AND mu.DESTINATARI_ID = u.ID AND mu.DESTINATARI_ID=" + ut.getId()
                +" ORDER BY m.DATA DESC";
           return (List<Messaggio>)em.createNativeQuery(strSQL,Messaggio.class).getResultList();
    }
    
    /**
    * Cerca tutti i messaggi inviati da un utente 
    * @param ut utente mittente
    * @return List<Messaggio> lista dei messaggi inviati dall'utente ut, altrimenti restituisce una lista vuota
    */ 
    @Override
    public List<Messaggio> getSendedMessages(Utente ut){
        
           String strSQL = "SELECT DISTINCT m.ID,m.CONTENUTO,m.DATA,m.LETTO,m.MITTENTE_ID "
                + "FROM MESSAGGIO m, MESSAGGIO_UTENTE mu, UTENTE u "
                +"WHERE mu.MESSAGGIOS_ID = m.ID AND mu.DESTINATARI_ID = u.ID AND m.MITTENTE_ID=" + ut.getId()
                + " ORDER BY m.DATA DESC";
                
           return (List<Messaggio>)em.createNativeQuery(strSQL,Messaggio.class).getResultList();
    }
    
    /**
    * Cerca tutti i messaggi ricevuti ma non ancora letti da un utente 
    * @param ut utente destinatario
    * @return List<Messaggio> lista dei messaggi ricevuti ma non ancora letti dall'utente ut, altrimenti restituisce una lista vuota
    */ 
    @Override
    public List<Messaggio> getUnreadMessages(Utente ut){
            String strSQL = "SELECT m.ID,m.CONTENUTO,m.DATA,m.LETTO,m.MITTENTE_ID "
                + "FROM MESSAGGIO m, MESSAGGIO_UTENTE mu, UTENTE u "
                +"WHERE mu.MESSAGGIOS_ID = m.ID AND mu.DESTINATARI_ID = u.ID AND m.LETTO=0 AND mu.DESTINATARI_ID=" + ut.getId()
                +" ORDER BY m.DATA DESC";
                
           return (List<Messaggio>)em.createNativeQuery(strSQL,Messaggio.class).getResultList();
    }
    
    /**
    * Cerca tutti i messaggi ricevuti e letti da un utente 
    * @param ut utente destinatario
    * @return boolean true se il messaggio è stato già letto, false altrimenti
    */ 
    @Override
    public boolean messageAlreadyRead(Long idMessaggio){
        
        String strSQL = "SELECT m.ID,m.CONTENUTO,m.DATA,m.LETTO,m.MITTENTE_ID "
                + "FROM MESSAGGIO m " 
                + "WHERE m.ID =" + idMessaggio;
                
                Messaggio m = (Messaggio)em.createNativeQuery(strSQL,Messaggio.class).getSingleResult();
                if(m.isLetto()) return true;
                return false;
     }
   
}
